package docker

//docker-0053-02-使用compose-yml编排部署go项目

//假设已经使用Dockerfile生成好了 images 文件，镜像是  myapp-golang:1.0
//   docker build -f Dockerfile -t myapp-golang:1.0 .

/*

	目录：
		1.不使用docker-compose.yml
		2.使用docker-compose.yml


----------------------2.使用docker-compose.yml----------------------

root@VM-4-8-debian:/#   touch docker-compose.yml
root@VM-4-8-debian:/#   vim docker-compose.yml

version: "3.8" 																#版本，向下兼容

services:
  goService:														#第一个服务/自定义服务名，只要不冲突
    image: myapp-golang:1.0													#需要的镜像
    command: "--default-authentication-plugin=mysql_native_password"		#启动镜像是带动的命令
    container_name: myapp-golang-container									#指定一个自定义容器名称，而不是一个生成的默认名称。如果不写，会默认的加上 当前目录名 + 服务名 如：mydockerapp-mysql
    volumes:																#-v 容器数据卷
      - /home/zydh/docker/volume/myapp-golang/data:/data
    restart: always															#总是重启
    environment:															#环境配置
      - WORKDIR_PATH=/home/zydh/docker/www/myapp-golang
      - VOLUME_PATH=/home/zydh/docker/volume
    networks:																# -net 网络
      - myapp_golang_net
    ports:																	#-p 端口号
      - "58080:8080"
    depends_on: 															#依赖服务,和下面的启动循序要保持一致
      - mysql
      - redis


    ##等价于一条docker run 命令
    ##  docker run -p 58080:8080 --net myapp_golang_net -v ...  -e VOLUME_PATH=/home/zydh/docker/volume  \
    ##		--name myapp-golang-container \
    ##		myapp-golang:1.0  --default-authentication-plugin=mysql_native_password

  mysql:																#第2个服务
      image: mysql:8.0.27														#需要的镜像
      command: '--default-authentication-plugin=mysql_native_password'		#解决外部无法访问  启动镜像是带动的命令
      container_name: myapp-golang-container-use-mysql
      volumes:																#msyql的容器数据卷
      - /home/zydh/docker/etc/mysql/conf:/etc/mysql/conf.d
      - /home/zydh/docker/volume/mysql/data:/var/lib/mysql
      - /home/zydh/logs/mysql:/var/log/mysql
      restart: always															#总是重启
      environment:															#环境配置
        - MYSQL_ROOT_PASSWORD= '123456'
        - MYSQL_DATABASE= 'wordpress'
        - MYSQL_USER=wordpress
        - MYSQL_PASSWORD=wordpress
        - MYSQL_ALLOW_EMPTY_PASSWORD=no
      ports:
        - "33060:3306"
      networks:																# -net 网络
        - myapp_golang_net

  redis:																#第3个服务
      image: redis:6.2.6														#需要的镜像
      command:  redis redis-server /etc/redis/redis.conf				#启动镜像是带动的命令
      container_name: myapp-golang-container-use-redis-2
      ports:																	#-p 端口号
        - "56371:6379"
        - "57371:16379"
      volumes:																#msyql的容器数据卷
          - /home/zydh/docker/volume/redis/node-2/data:/data
          - /home/zydh/docker/etc/redis/node-2/conf/redis.conf:/etc/redis/redis.conf
      restart: always															#总是重启
      networks:																# -net 网络
        myapp_golang_net:
          ipv4_address: 173.38.0.12
          ##ipv6_address: 2001:3984:3989::10

  wordpress:														#第二个服务
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
      - /:/rootfs:ro												# :ro :rw 只读，只写
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db:3306									#db的端口	db 上面服务的db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress




#其他配置 网络/卷，全局规则...

volumes:					#具名挂载
 # db_data:
  wp_data:					##   上面服务[wordpress]的 volumes 调用了 wp_data

networks:
  myapp_golang_net:
     ipam:
        driver: bridge
        config:
          - subnet: "173.38.0.0/16"
          #- subnet: "2001:3984:3989::/64"
      #- gateway: "173.38.0.1"
      #其他的IPAM配置，比如网关，目前只支持版本version 2。
      ##docker network create --driver bridge --subnet 173.38.0.0/16 --gateway 173.38.0.1 redis-colony




而goweb项目里面的config.ini里面，
	mysql
	原来使用 ip:端口号链接mysql 173.38.0.15:33060  变为  myapp-golang-container-use-mysql:33060
	redis
		173.38.0.15:56379   更为为   myapp-golang-container-use-redis-2:56379

	部署到容器后，同一个网段寻找容器名为   myapp-golang-container-use-mysql 和 myapp-golang-container-use-redis-2

#使用docker compose config -q 检查


root@VM-4-8-debian:/tmp# vim docker-compose.yml
root@VM-4-8-debian:/tmp# docker compose config -q
yaml: line 8: could not find expected ':'				##第26行， ： 右侧应有空格，报错原文     container_name:myapp-golang-container
root@VM-4-8-debian:/tmp# vim docker-compose.yml
root@VM-4-8-debian:/tmp# docker compose config -q
yaml: line 26: did not find expected key				##报错，原本第47、67行 行前距没有对准/对齐
root@VM-4-8-debian:/tmp# vim docker-compose.yml
root@VM-4-8-debian:/tmp# vim docker-compose.yml
root@VM-4-8-debian:/tmp# docker compose config -q
yaml: line 26: did not find expected key				##报错，一些行前距没有对准/对齐
root@VM-4-8-debian:/tmp# vim docker-compose.yml
root@VM-4-8-debian:/tmp# docker compose config -q
(root) Additional property myapp_golang_net is not allowed	##注意是否关键词对准或缺少某一关键词，此处原本是第88 行缺少了关键字 networks
root@VM-4-8-debian:/tmp#
root@VM-4-8-debian:/tmp# vim docker-compose.yml
root@VM-4-8-debian:/tmp# docker compose config -q
root@VM-4-8-debian:/tmp#								##这里并未弹出错，说明.yml编写正确



#前台启动
root@VM-4-8-debian:/#  docker compose up #启动

#后台启动
root@VM-4-8-debian:/#  docker compose up -d


----------------------1.不使用docker-compose.yml----------------------

	启动mysql
	docker run -it --name my-app-mysql -p ... -v ...  mysql  ......
		启动后，使用第三方工具，Navicat Premium  链接远程mysql，再导入数据库

	启动redis
	docker run -it --name my-app-redis -p ... -v ...  redis  ......
		启动后，完成配置，直接把本地的appendonly.db导入 -v :/data 的位置

	如果还有其它，如nginx，es，rabbitmq，kafka等，都需要如此
	....
	docker run ....


	最后启动微服务
	docker run -it --name my-app-golang -p ... -v ...  myapp-golang:1.0  ....


	如上所述：如果有很多images要启动，就要写很多很多的docker run

	问题：
		先后顺序要求固定，先mysql+redis才能微服务访问成功
		多个run命令.....
		容器间的启停或宕机，有可能导致I地址对应的容器实例变化，映射出错要么生产Ip写死(可以但是不推荐)，要么通过服务调用



*/
